% 默认页面大小 4:3
% \documentclass[10pt]{ctexbeamer}
% 页面大小 16:10
% \documentclass[10pt, aspectratio=1610]{ctexbeamer}
% 页面大小 16:9
\documentclass[10pt, aspectratio=169]{ctexbeamer}
% 页面大小 14:9
% \documentclass[10pt, aspectratio=149]{ctexbeamer}
% 页面大小 1.41:1
% \documentclass[10pt, aspectratio=141]{ctexbeamer}
% 页面大小 5:4
% \documentclass[10pt, aspectratio=54]{ctexbeamer}
% 页面大小 3:2
% \documentclass[10pt, aspectratio=32]{ctexbeamer}

\usetheme[logo=UCAS, sublogo=UCAS]{ucas}
% logo 的选项: CAS, UCAS
% sublogo 的选项: AMSS, AMSS2018, UCAS

% 引入参考文献列表的 .bib 文件, 使用 GB/T 7714-2015 的文献著录规则.
\usepackage[backend=biber, style=gb7714-2015]{biblatex}
\usepackage{listings}
\usepackage{amsmath}
\usepackage{longtable}
\usepackage{caption}
\captionsetup[table]{skip=1pt} % 10pt 可以根据需要调整
\addbibresource{ref.bib}

\title[机器学习系统中期汇报]{机器学习系统中期汇报}
\subtitle[睡眠状态监测]{睡眠状态监测}
\author[王春祥、陈德、黄雨彤]{\href{mailto:timwcx@qq.com}{王春祥、陈德、黄雨彤}}
\date[\today]{\today, 中国南京}
\subject{睡眠状态监测}
\keywords{mlcourse}

\begin{document}

\begin{frame}[plain]
	\maketitle
\end{frame}

\begin{frame}[t]
	\frametitle{目录}
	\tableofcontents
\end{frame}

\section[数据来源]{数据来源}

\begin{frame}{CMI睡眠监测}
	\begin{block}{比赛动机 \footnotemark[1]}
		根据腕表加速度传感器数据，检测入睡和苏醒两个事件，以判断睡眠状态。给定传感器序列数据，要求检测出哪个时间step下出现入睡和苏醒事件，以及对应的置信分数。
	\end{block}

	\begin{columns}
		\column{0.65\textwidth}
		\begin{block}{CMI机构}
			Child Mind Institute旨在吸引全球的数据科学家和机器学习专家，共同开发出高效、准确的算法，以识别和分类儿童的睡眠事件，如睡眠起始和觉醒。这样的技术进步不仅可以增进我们对儿童睡眠障碍的理解，还可能对诊断和治疗相关睡眠问题产生深远的影响。
		\end{block}
		\column{0.3\textwidth}
		\begin{figure}
			\includegraphics[width=.9\textwidth, height=.9\textheight, keepaspectratio]{./figures/cmi.png}
		\end{figure}
	\end{columns}

	\footnotetext[1]{比赛来源：\href{https://www.kaggle.com/competitions/child-mind-institute-detect-sleep-states/}{https://www.kaggle.com/competitions/child-mind-institute-detect-sleep-states/}}
\end{frame}

\begin{frame}{数据描述}
	整个比赛有四个数据文件，分别为：
	\begin{itemize}
		\item train\_series.parquet 训练集传感器数据
		\item test\_series.parquet 测试集传感器数据
		\item train\_events.csv 训练集的睡眠日志
		\item sample\_submission.csv 测试集的预测睡眠日志
	\end{itemize}
\end{frame}

\begin{frame}{数据描述}
	\begin{columns}
		\column{0.5\textwidth}
		\begin{block}{train\_series.parquet - 训练数据集 \footnotemark[1]}
			\begin{itemize}
				\item series\_id：每个加速度计系列的唯一标识符
				\item step：每个观测值的整数时间步长
				\item timestamp：相对应的日期时间
				\item anglez：由GGIR包计算和描述的z轴角度，是从个体加速度计组件派生出的常用于睡眠检测的度量，指的是手臂相对于身体垂直轴的角度
				\item enmo：由GGIR包计算和描述的ENMO，是所有加速度信号的计算特征之一，将负值四舍五入到零
			\end{itemize}
		\end{block}
		\column{0.5\textwidth}
		\begin{figure}
			\includegraphics[width=.9\textwidth, height=.9\textheight, keepaspectratio]{./figures/train_series_parquet.png}
		\end{figure}
	\end{columns}
	\footnotetext[1]{测试数据集test\_series.parquet结构和train\_series.parquet相同}
	% 测试数据集包含与训练数据集相同的字段。您需要为这个文件中的系列预测事件的发生
\end{frame}

\begin{frame}{数据描述}
	\begin{columns}
		\column{0.5\textwidth}
		\begin{block}{train\_events.csv - 训练集的睡眠日志}
			\begin{itemize}
				\item series\_id：train\_series\.parquet中加速度计数据系列的唯一标识符
				\item night：潜在的起始/唤醒事件对的枚举。每个夜晚最多可以发生一对事件
				\item event：事件的类型，可以是起始（onset）或唤醒（wakeup）
				\item step 和 timestamp：在加速度计系列中记录的事件的发生时间
			\end{itemize}
		\end{block}
		\column{0.5\textwidth}
		\begin{figure}
			\includegraphics[width=.8\textwidth, height=.8\textheight, keepaspectratio]{./figures/train_events_csv.png}
		\end{figure}
	\end{columns}
\end{frame}

\begin{frame}{数据描述}
	\begin{columns}
		\column{0.55\textwidth}
		\begin{block}{sample\_submission.csv - 测试集的睡眠日志}
			\begin{itemize}
				\item series\_id：train\_series\.parquet中加速度计数据系列的唯一标识符
				\item event：事件的类型，可以是起始（onset）或唤醒（wakeup）
				\item step：在加速度计系列中记录的事件的发生时间
				\item score：置信度，发生的可能性
			\end{itemize}
		\end{block}
		\column{0.45\textwidth}
		\begin{figure}
			\includegraphics[width=.8\textwidth, height=.8\textheight, keepaspectratio]{./figures/test_events_csv.png}
		\end{figure}
	\end{columns}
\end{frame}

\section[特征工程]{特征工程}

\begin{frame}{数据处理}
	\begin{columns}
		\column{0.6\textwidth}
		\begin{figure}
			\includegraphics[width=.9\textwidth, height=.9\textheight, keepaspectratio]{figures/random_forest_2.png}
		\end{figure}
		\column{0.4\textwidth}
		\begin{block}{数据特征}
			\begin{itemize}
				\item anglez角度在睡眠期间的变化类似于一个纯跳跃过程(jump process)，而在清醒期间，它类似于一个扩散过程(diffusion process)。
				\item ENMO加速度在睡眠期间数值较为活跃，而在睡眠期间加速度较小。
			\end{itemize}
		\end{block}
	\end{columns}
\end{frame}

\begin{frame}{数据处理}
	\begin{itemize}
		\item   我们观察到在睡眠期间，anglez的变化类似于一个纯跳跃过程(jump process)，而在清醒期间，它类似于一个扩散过程(diffusion process)。
		\item   跳跃过程和扩散过程可以通过一阶差分来区分。对于不断抖动的扩散过程，一阶差分是无限的，而对于跳跃过程，一阶差分是有限的，因为它们只在有限的次数上发生有限的变化。
	\end{itemize}
	\begin{figure}
		\includegraphics[width=.8\textwidth, height=.8\textheight, keepaspectratio]{figures/anglez.png}
	\end{figure}
\end{frame}

\begin{frame}{数据处理}
	\begin{itemize}
		\item   我们观察到在睡眠期间，anglez的变化类似于一个纯跳跃过程(jump process)，而在清醒期间，它类似于一个扩散过程(diffusion process)。
		\item   跳跃过程和扩散过程可以通过一阶差分来区分。对于不断抖动的扩散过程，一阶差分是无限的，而对于跳跃过程，一阶差分是有限的，因为它们只在有限的次数上发生有限的变化。
	\end{itemize}
	\begin{figure}
		\includegraphics[width=.8\textwidth, height=.8\textheight, keepaspectratio]{figures/anglezdiffabs.png}
	\end{figure}
\end{frame}

\begin{frame}{特征工程}
	对于离散、均匀采样的函数 $ f(t) $ 在区间 $ [a, b] $ 上，一阶差分可以定义为：

	$$ V_{a}^{b}(f) := \sum_{j=0}^{n-1} |f(t_{j+1}) - f(t_{j})| $$

	因此我们可以借助dataframe的diff()函数来计算指定窗口大小的差分。

	所以模型选取的特征包括:
	\begin{itemize}
		\item 数据对应的小时，hour
		\item 不同窗口大小（从5分钟到8小时）的anglez和enmo的滚动汇总（平均值、最大值、标准差）
		\item 不同窗口大小（从5分钟到8小时）的anglez和enmo一阶差分绝对值的滚动汇总（平均值、最大值、标准差）。
	\end{itemize}
\end{frame}

\section[单机机器学习系统]{单机机器学习系统}

\subsection[单机机器学习系统]{单机机器学习系统}
\begin{frame}{随机森林模型训练}
	\begin{columns}
		\column{0.6\textwidth}
		\begin{figure}
			\includegraphics[width=.9\textwidth, height=.9\textheight, keepaspectratio]{./figures/random_forest_train.png}
		\end{figure}
		\column{0.4\textwidth}
		\begin{block}{模型参数}
			\begin{itemize}
				\item n\_estimators: 500 森林中决策树的数量
				\item min\_samples\_leaf: 25  在叶节点处需要的最小样本数
				\item criterion: gini 分裂节点所用的标准
			\end{itemize}
		\end{block}
		\begin{block}{模型评测}
			Random forest score: 0.453740167825176
		\end{block}
	\end{columns}
\end{frame}

\subsection[AutoML调参]{AutoML调参}
\begin{frame}{利用AUTOML对随机森林超参进行优化}
	\begin{columns}
		\column{0.4\textwidth}
		\begin{figure}
			\includegraphics[width=.8\textwidth, height=.8\textheight, keepaspectratio]{./figures/automl.png}
		\end{figure}
		\column{0.6\textwidth}
		\begin{block}{最优参数}
			\begin{itemize}
				\item criterion: gini
				\item max\_depth: 33
				\item max\_features: 8
				\item min\_samples\_leaf: 21
				\item n\_estimators: 714
			\end{itemize}
		\end{block}
		\begin{block}{最终结果}
			AutoML找到的最优决策森林： \\
			Random forest score: 0.4600938236346655 \\
			之前的随机森林： \\
			Random forest score: 0.453740167825176
		\end{block}
	\end{columns}
\end{frame}

\section[多机机器学习系统]{多机机器学习系统}

\subsection[多机机器学习系统]{多机机器学习系统}

\begin{frame}{多机机器学习系统}
	Dask 是一个灵活并行计算库，用于在 Python 中进行大规模数据处理。它的设计目标是帮助用户更高效地处理大数据集，尤其是在内存有限的情况下。
	\begin{itemize}
		\item 并行计算： Dask 可以将计算任务分配到多个核心或多个机器上，从而加速处理速度。
		\item 集成性强： Dask 与现有的 Python 数据科学工具（如 NumPy、pandas、scikit-learn 等）无缝集成。
		\item 动态任务调度： Dask 使用一个动态的任务调度器，根据任务依赖关系进行调度，支持复杂的计算图
	\end{itemize}
	\begin{figure}
		\includegraphics[width=.6\textwidth, height=.4\textheight, keepaspectratio]{./figures/dask.png}
	\end{figure}
\end{frame}

\subsection[单机、多机机器学习系统对比]{单机、多机机器学习系统对比}

\begin{frame}{配置信息}
	\begin{itemize}
		\item 单机硬件环境:由节点1构成
		\item 分布式硬件环境:由节点1和节点2共同组成分布式环境
	\end{itemize}
	% 第一部分表格
	\begin{table}[h!]
		\centering
		\begin{tabular}{|c|c|}
			\hline
			Configuration & Specification              \\
			\hline
			CPU           & AMD Ryzen™ 7 7840HS        \\
			\hline
			核心数           & 8核16线程                     \\
			\hline
			CPU基准频率       & 3.8 GHz                    \\
			\hline
			CPU最高频率       & 5.1 GHz                    \\
			\hline
			Memory        & 32GB LPDDR5 6400MHZ(8GBx4) \\
			\hline
		\end{tabular}
		\caption{节点信息1}
		\label{table:node1}
		% 第二部分表格
		\begin{tabular}{|c|c|}
			\hline
			Configuration & Specification            \\
			\hline
			CPU型号         & Intel® Core™ i5-8300H    \\
			\hline
			核心数           & 4核8线程                    \\
			\hline
			CPU基准频率       & 2.3 GHz                  \\
			\hline
			CPU最高频率       & 4.0 GHz                  \\
			\hline
			内存            & 16GB DDR4 2667MHz(8GBx2) \\
			\hline
		\end{tabular}
		\caption{节点信息2}
		\label{table:node2}
	\end{table}

\end{frame}

\begin{frame}{资源占用对比}
	我们将单机训练和分布式训练消耗的资源，以及训练速度进行比较。

	\begin{figure}
		\includegraphics[width=.6\textwidth, height=.4\textheight, keepaspectratio]{./figures/distributed_status.png}

	\end{figure}
	\begin{table}[h!]
		\centering
		\begin{tabular}{|c|c|c|}
			\hline
			比较对象   & 单机环境            & 分布式环境                 \\
			\hline
			训练时间   & 15m21s          & 12m38s                \\
			\hline
			CPU占用率 & $\approx$1600\% & $\approx$1600\%+800\% \\
			\hline
			内存开销   & 17.2GiB         & 17.1GiB+1.2GiB        \\
			\hline
		\end{tabular}
		\caption{比较单机环境和分布式环境}
		\label{table:comparison}
	\end{table}

\end{frame}

\section[深度学习系统]{深度学习系统}
\subsection[深度学习模型]{深度学习模型}

\begin{frame}{RNN循环神经网络}
	\begin{columns}
		\column{0.5\textwidth}
		\begin{block}{RNN循环神经网络}
			RNN层级结构较之于CNN来说比较简单，它主要有输入层，Hidden Layer，输出层组成。并且会发现在Hidden Layer 有一个箭头表示数据的循环更新, 这个就是实现时间记忆功能的方法。
		\end{block}
		\begin{figure}
			\includegraphics[width=.8\textwidth, height=.4\textheight, keepaspectratio]{./figures/gru.png}
		\end{figure}
		\column{0.5\textwidth}
		\begin{figure}
			\includegraphics[width=.8\textwidth, height=.4\textheight, keepaspectratio]{./figures/rnn.png}
		\end{figure}
		\begin{block}{GRU模型}
			GRU是一种循环神经网络（RNN）的变体，相比于传统的循环神经网络LSTM，它将忘记门和输入门合并成为一个单一的更新门, 同时合并了数据单元状态和隐藏状态，具有更少的参数和计算复杂度。它通过引入门控单元来控制信息的流动，从而在处理长期依赖关系时具有更好的性能。
		\end{block}
	\end{columns}
\end{frame}

\begin{frame}{RNN循环神经网络训练}
	\begin{columns}
		\column{0.4\textwidth}
		\begin{figure}
			\includegraphics[width=.8\textwidth, height=.8\textheight, keepaspectratio]{./figures/model.png}
		\end{figure}
		\column{0.6\textwidth}
		\begin{block}{半精度训练}
			通过数据类型和数据范围进行动态压缩，整形类型根据范围压缩为int8、int16、int32和int64，浮点类型压缩为float16和float32，最终节省内存2059.05MB
		\end{block}
		\begin{block}{特征工程：高斯平滑标签}
			标签平滑（Label smoothing），像L1、L2和dropout一样，是机器学习领域的一种正则化方法，通常用于分类问题，目的是防止模型在训练时过于自信地预测标签，改善泛化能力差的问题。
		\end{block}
		\begin{block}{训练过程}
			\begin{itemize}
				\item 随机梯度下降，5轮迭代训练
				\item MSE均方误差损失函数
			\end{itemize}
		\end{block}
	\end{columns}
\end{frame}

\begin{frame}{RNN循环神经网络结果}
	\begin{columns}
		\column{0.6\textwidth}
		\begin{figure}
			\includegraphics[width=.8\textwidth, height=.8\textheight, keepaspectratio]{./figures/rnn_lose.png}
		\end{figure}
		\column{0.4\textwidth}
		\begin{tabular}{|c|c|c|}
			\toprule
			训练损失     & 验证损失     & 学习率     \\
			\midrule
			0.753794 & 0.461757 & 0.00065 \\
			0.429608 & 0.380922 & 0.00034 \\
			0.386815 & 0.349618 & 0.00009 \\
			0.363551 & 0.349730 & 0.00002 \\
			0.357923 & 0.349717 & 0.00001 \\
			\bottomrule
		\end{tabular}
		\begin{block}{测试结果}
			测试数据集上正确率：0.628

			随机森林模型正确率：0.460
		\end{block}
	\end{columns}
\end{frame}

\section[总结]{总结}

\begin{frame}{总结}
	\begin{block}{单机机器学习系统 vs 多机机器学习系统}
		\begin{itemize}
			\item 运行随机森林模型
			\item 单机sklearn训练 vs Dask分布式sklearn训练
			\item 分布式机器学习系统相对于单机机器学习系统训练速度加快
		\end{itemize}
	\end{block}
	\begin{block}{机器学习系统 vs 深度学习系统}
		\begin{itemize}
			\item 随机森林决策 vs RNN循环神经网络
			\item 正确率 0.460 vs 0.628
			\item 训练时间 12min(CPU) vs 45min(GPU)
			\item 深度学习模型较机器学习模型预测能力更强
			\item 深度学习模型较机器学习模型计算量更大
		\end{itemize}
	\end{block}
\end{frame}

\section[下一个题目介绍]{下一个题目介绍}
\begin{frame}{下一个题目介绍}
	\begin{itemize}
		\item TransFormer训练模型预测睡眠状态
		\item 用Docker构建生产环境传入传感器数据预测睡眠状态
	\end{itemize}
\end{frame}

\begin{frame}[plain]
	\vfill
	\centerline{\Huge 谢谢}
	\vfill
\end{frame}

\end{document}
